<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<!--
			*默认使用const声明变量
			*当变量需要重新赋值和更新的时候使用let
			*尽量不使用var

			特性	    var	let	const
			变量提升	✔️	×	×
			全局变量	✔️	×	×
			重复声明	✔️	×	×
			重新赋值	✔️ ✔️   ×
			暂时性死区	×	✔️	✔️
			块作用域	×	✔️	✔️
		只声明不初始化	✔️	✔️	×
		-->
		<script type="text/javascript">
			(function(){
				// 立即执行函数,使内部变量私有化,避免污染全局
				// 使用let、const即可轻松解决，不需要使用立即执行函数实现
				var name='jelly';
				console.log(name);//jelly
			})();
			
			
				
			// es5	
			// 变量i是var声明的,在全局范围内都有效,所以全局只有一个变量i.
			// 每一次循环,变量i都会发生改变,而循环内被赋值的i变量,里面的i指向的都是全局的i,所以导致运行时输出的是最后的一轮i的值
			for(var i=0;i<10;i++){
				console.log(i);//0 1 2 3 4 5 6 7 8 9
				setTimeout(function(){
					console.log(i);//10个10
				},900)
			}
			
			// es6
			// 说明输出的i和循环的i不是同一个变量,它们只在自己的代码块内有效
			// 设置循环变量的那部分是一个父作用域，而循环体内部是一个单独的子作用域。
			for(let i=0;i<10;i++){
				console.log(i);//0 1 2 3 4 5 6 7 8 9
				setTimeout(function(){
					console.log(i);//0 1 2 3 4 5 6 7 8 9
				},10)
			}
			
			
		</script>
	</body>
</html>
